iT邦幫忙

2023 iThome 鐵人賽

DAY 3
0
Software Development

30天快速打造Python資料結構&演算法邏輯刷爆LeetCode系列 第 3

DAY 3 「陣列(Array)、連結串列(Linked List) VS. 堆疊(Stack)、佇列(Queue)」還有Python資料結構傻傻分不清楚?

  • 分享至 

  • xImage
  •  

暈暈暈好多種資料結構到底如何一次搞懂

簡單來說可以「用3種角度」來看~~~
/images/emoticon/emoticon06.gif白話「不同角度」有不同角度(記憶體/讀取方式/程式語言)資料結構的定義


  • 按讀取方式分:
    讀取資料結構有2種:堆疊(Stack)、佇列(Queue List)
    堆疊: 先進後出(LIFO)只能在一端進行插入和刪除操作
    網頁瀏覽器的前進和後退功能」:瀏覽器使用一個堆疊來記錄用戶瀏覽的網頁歷史,從而實現“返回”和“前進”功能
    佇列: 先進先出(FIFO)元素的插入操作只能在一端進行,而元素的刪除操作則在另一端進行
    排隊系統」:在現實生活中的排隊場景,如銀行、超市等地,可以使用佇列來管理顧客的進出
    /images/emoticon/emoticon01.gif=> 可用基礎資料結構陣列(Array)、連結串列(Linked List)來各自實現堆疊(Stack)或佇列(Queue List)

  • 按程式語言分:
    Python總得來說有1種:list(列表) 實際上是一種「動態陣列(Dynamic Array)」而非傳統上連結串列
    動態調整大小:list可以動態調整大小,因此在創建時不需要指定大小
    連續的記憶體空間:在內部實現上list使用了一塊連續的記憶體空間來存儲元素
    支持任意類型的元素:list可以存儲不同類型的元素,例如整數、浮點數、字串等
    通過索引訪問:可以通過索引來訪問list中的元素,索引可以是整數或整數表達式
    提供了豐富的方法和操作:list提供了許多方法,如增加元素、刪除元素、排序、反轉等,以便於對元素進行操作
    支持切片(Slicing):可以使用切片來選擇list中的部分元素

/images/emoticon/emoticon06.gif白話來說Python的「List列表」不是陣列(Array)也不是連結串列(Linked List)

https://ithelp.ithome.com.tw/upload/images/20230917/20150603uy9LxxH0ZW.png
https://ithelp.ithome.com.tw/upload/images/20230917/20150603NKzWKs62on.png

這2張圖說明各種資料結構及演算法的各種操作Big O時間複雜度https://www.bigocheatsheet.com/


那Python到底有哪些資料結構(資料類型)呢?

列表 (List): 一種有序的元素集合,可以包含不同類型的資料
元組 (Tuple): 類似於列表,但是元組的元素是不可修改的
集合 (Set): 一種無序的元素集合,不包含重複的元素
字典 (Dictionary): 一種鍵值對的集合,可以通過鍵來快速訪問對應的值
矩陣 (Matrix): 可以使用numpy庫來處理多維陣列
表格 (DataFrame): 可以使用pandas庫來處理CSV/Excel或SQL數據表
/images/emoticon/emoticon30.gif明天來說說Python這6個重要重要超級重要的資料結構你才能學好Python

使用Python列表(List)實作陣列(Array)、連結串列(Linked List)、堆疊(Stack)、佇列(Queue)

# 陣列(Array)
class MyArray:
    def __init__(self):
        self.array = []

    def insert(self, element):
        self.array.append(element)

    def get_element(self, index):
        return self.array[index]

    def delete_element(self, index):
        del self.array[index]

my_array = MyArray()
my_array.insert(1)
my_array.insert(2)
my_array.insert(3)
print(my_array.get_element(1))  
my_array.delete_element(0)
print(my_array.get_element(0))  
# 連結串列(Linked List)
class Node:
    def __init__(self, data):
        self.data = data
        self.next = None

class LinkedList:
    def __init__(self):
        self.head = None

    def append(self, data):
        new_node = Node(data)
        if not self.head:
            self.head = new_node
            return
        current = self.head
        while current.next:
            current = current.next
        current.next = new_node

my_linked_list = LinkedList()
my_linked_list.append(1)
my_linked_list.append(2)
my_linked_list.append(3)
# 堆疊(Stack) 先進後出(LIFO)
class Stack:
    def __init__(self):
        self.stack = []

    def push(self, element):
        self.stack.append(element)

    def pop(self):
        if self.stack:
            return self.stack.pop()
        else:
            return None

my_stack = Stack()
my_stack.push(1)
my_stack.push(2)
my_stack.push(3)
print(my_stack.pop()) 
# 佇列(Queue) 先進先出(FIFO)
class Queue:
    def __init__(self):
        self.queue = []

    def enqueue(self, element):
        self.queue.append(element)

    def dequeue(self):
        if self.queue:
            return self.queue.pop(0)
        else:
            return None

my_queue = Queue()
my_queue.enqueue(1)
my_queue.enqueue(2)
my_queue.enqueue(3)
print(my_queue.dequeue())  

上一篇
DAY 2 「大O複雜度(Big O notation and Time Complexity)」你的程式碼效率如何呢?
下一篇
DAY 4 「Python資料結構」列表List、字典Dic、矩陣(向量)NumPy、表格(DataFrame)Pandas建立資料王國
系列文
30天快速打造Python資料結構&演算法邏輯刷爆LeetCode30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
Chikuwa
iT邦新手 2 級 ‧ 2024-06-09 01:07:55

一開始的表格中,操作與讀取複雜度寫反了

陣列讀取快,鏈結串列則是寫入快~

我要留言

立即登入留言